package com.jms.framework.jdbc.transaction.adaper;

import com.jms.framework.exception.PropertyAlreadySetException;
import com.jms.framework.jdbc.transaction.TransactionManagement;
import java.sql.Connection;

/**
 * 事务适配器类，用于管理事务操作
 * 该类通过单例模式确保在应用程序中只有一个实例，以统一事务管理策略、
 * @author JMS
 * @version 1.0.0
 * @since 2025-01-26
 */
public class TransactionManagementAdapter {

    // 使用volatile关键字确保多线程环境下的可见性
    private volatile static TransactionManagementAdapter instance;

    // 事务管理器，负责具体的事务操作
    private TransactionManagement transactionManagement;

    // 标记事务管理是否已初始化
    private static boolean transactionManagementIsOpen = false;

    // 私有构造方法，防止外部实例化
    private TransactionManagementAdapter() {
    }

    /**
     * 获取TransactionAdapter的单例实例
     *
     * @return TransactionAdapter的实例
     */
    public static TransactionManagementAdapter getInstance() {
        if (instance == null) {
            synchronized (TransactionManagementAdapter.class) {
                if (instance == null) {
                    instance = new TransactionManagementAdapter();
                }
            }
        }
        return instance;
    }

    /**
     * 设置事务管理器
     * 如果已经设置了事务管理器，则抛出异常
     *
     * @param transactionManagement 事务管理器
     * @throws PropertyAlreadySetException 如果事务管理器已经被设置
     */
    public void setTransactionManagement(TransactionManagement transactionManagement) {
        if (this.transactionManagement != null) {
            throw new PropertyAlreadySetException(TransactionManagement.class, "transactionManagement");
        }
        this.transactionManagement = transactionManagement;
        transactionManagementIsOpen = true;
    }

    /**
     * 获取当前的事务管理器
     *
     * @return 当前的事务管理器
     */
    public TransactionManagement getTransactionManagement() {
        return transactionManagement;
    }

    /**
     * 开始事务
     */
    public void begin() {
        transactionManagement.begin();
    }

    /**
     * 提交事务
     */
    public void commit() {
        transactionManagement.commit();
    }

    /**
     * 回滚事务
     */
    public void rollback() {
        transactionManagement.rollback();
    }

    /**
     * 关闭事务
     */
    public void close() {
        transactionManagement.close();
    }

    /**
     * 检查事务是否处于活动状态
     *
     * @return 如果事务处于活动状态则返回true，否则返回false
     */
    public boolean transactionIsActive() {
        return transactionManagement != null && transactionManagement.transactionIsActive();
    }

    /**
     * 检查事务是否已经打开
     *
     * @return 如果事务已经打开则返回true，否则返回false
     */
    public boolean transactionIsOpen() {
        return transactionManagement != null && transactionManagement.transactionIsOpen();
    }

    /**
     * 获取当前事务的数据库连接
     *
     * @return 当前事务的数据库连接
     */
    public Connection getCurrentConnection() {
        return transactionManagement != null ? transactionManagement.getCurrentConnection() : null;
    }

    /**
     * 检查事务管理是否开启
     *
     * @return 如果事务管理是否开启则返回true，否则返回false
     */
    public static boolean transactionManagementIsOpen() {
        return transactionManagementIsOpen;
    }

    public static void openTransactionManagement() {
        transactionManagementIsOpen = true;
    }
}
